﻿#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
using namespace std;
//
//#include <time.h>
//struct A { int a[10000]; };
//void TestFunc1(A a) {}
//void TestFunc2(A& a) {}
//void TestRefAndValue()
//{
//	A a;
//	// 以值作为函数参数
//	size_t begin1 = clock();
//	for (size_t i = 0; i < 10000; ++i)
//		TestFunc1(a);
//	size_t end1 = clock();
//	// 以引用作为函数参数
//	size_t begin2 = clock();
//	for (size_t i = 0; i < 10000; ++i)
//		TestFunc2(a);
//	size_t end2 = clock();
//	// 分别计算两个函数运行结束后的时间
//	cout << "TestFunc1(A)-time:" << end1 - begin1 << endl;
//	cout << "TestFunc2(A&)-time:" << end2 - begin2 << endl;
//}
//
//int main()
//{
//	TestRefAndValue();
//
//	return 0;
//}
//
//int main()
//{
//	// 权限可以平移/缩小 不能放大
//	double d = 12.34;
//	int i = d;
//
//	//int& r = d;//err,类型转换会产生临时变量
//	//临时变量有常性
//	const int& r1 = d;
//
//	int x = 0, y = 1;
//	//int& r2 = x + y;表达式的结果也会产生临时变量
//	//临时变量有常性
//	const int& r2 = x + y;
//
//	return 0;
//}

//int main()
//{
//	int a = 10;
//	int& ra = a;
//	cout << "&a = " << &a << endl;
//	cout << "&ra = " << &ra << endl;
//	return 0;
//}


int main()
{
	int a;
	a = 10;
	int& ra = a;	//语法上不开空间
	ra = 20;

	int m = 10;
	m = 30;
	a = m;

	int* pa = &a; //语法上要开空间
	*pa = 20;
	pa = &m;

	int* ptr = NULL;

	*ptr;
	int& r = *ptr;//这里只是把ptr的地址保存起来,并没有对空指针解引用

	cout << sizeof(ra) << endl;
	cout << sizeof(a) << endl;
	cout << sizeof(double&) << endl;
	cout << sizeof(int&) << endl;

	return 0;
}

//int main()
//{
//	int j = 0;
//
//	//右边初始化自动推导类型
//	auto i = 0;
//
//	return 0;
//}

//typedef char* pstring;
//int main()
//{
//	//const修饰的变量必须被初始化，因为只有一次初始化的机会
//	//const pstring p1; // err, 等价于<==> char* const p1 
//	
//	//这里const限制的是*p1，p1可以不初始化
//	const pstring* p2; // 等价于<==> char* const * p1
//	return 0;
//}

int TestAuto()
{
	return 10;
}

//int main()
//{
//	int a = 10;
//	auto b = a;
//	auto c = 'a';
//	auto d = TestAuto();
//
//	cout << typeid(b).name() << endl;
//	cout << typeid(c).name() << endl;
//	cout << typeid(d).name() << endl;
//
//	//auto e; 无法通过编译，使用auto定义变量时必须对其进行初始化
//	return 0;
//}

//int main()
//{
//	int x = 10;
//
//	auto a1 = x;
//	auto a2 = &x;
//
//	//必须是指针
//	auto* b = &x;
//
//	//引用
//	auto& c = x;
//}

//int main()
//{
//	int array[] = { 1,2,3,4,5 };
//	int sz = sizeof(array) / sizeof(array[0]);
//
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		array[i] *= 2;
//	}
//
//	for (i = 0; i < sz; i++)
//	{
//		cout << array[i] << " ";
//	}
//	cout << endl;
//
//	//C++范围for
//	//自动取数组array中的值,赋值给e
//	//自动++,自动判断结束
//	for (auto& e : array)//如果是赋值并不会影响数组里面的内容,所以这里要用引用
//	{
//		e /= 2;
//	}
//
//	for (int x : array)
//	{
//		cout << x << " ";
//	}
//	cout << endl;
//
//	return 0;
//}

//void f(int)//函数的定义不用可以不写形参
//{
//	cout << "void f(int)" << endl;
//}
//
//void f(int* p)
//{
//	cout << "f(int*)" << endl;
//}
//
//
//int main()
//{
//	f(0);
//	f(NULL);
//	f((int*)NULL);
//	f(nullptr);
//
//	return 0;
//}


